package cart

import (
	"wx-uniapp-go/internal/logic/cart_logic"
	"wx-uniapp-go/internal/repository/dto"
	"wx-uniapp-go/internal/server/ctxop"
	"wx-uniapp-go/internal/server/echo"

	"github.com/gin-gonic/gin"
)

// GetCartList 获取购物车列表
func GetCartList(c *gin.Context) {
	ctx := echo.TraceCtx(c)
	userId := ctxop.GetUser(ctx).Id
	logic := cart_logic.NewCartLogic(echo.TraceCtx(c))
	resp, err := logic.GetCartList(userId)
	if err != nil {
		echo.Fail(c).Error(err)
		return
	}
	echo.Success(c, resp)
}

// GetCartCount 获取购物车商品总数
func GetCartCount(c *gin.Context) {
	ctx := echo.TraceCtx(c)
	userId := ctxop.GetUser(ctx).Id
	logic := cart_logic.NewCartLogic(echo.TraceCtx(c))
	resp, err := logic.GetCartCount(userId)
	if err != nil {
		echo.Fail(c).Error(err)
		return
	}
	echo.Success(c, resp)
}

// AddCart 添加购物车
func AddCart(c *gin.Context) {
	ctx := echo.TraceCtx(c)
	userId := ctxop.GetUser(ctx).Id
	var req dto.CartAddReq
	if err := c.ShouldBindJSON(&req); err != nil {
		echo.Fail(c).Error(err)
		return
	}

	logic := cart_logic.NewCartLogic(echo.TraceCtx(c))
	err := logic.AddCart(userId, &req)
	if err != nil {
		echo.Fail(c).Error(err)
		return
	}
	echo.Success(c, nil)
}

// UpdateCart 更新购物车
func UpdateCart(c *gin.Context) {
	ctx := echo.TraceCtx(c)
	userId := ctxop.GetUser(ctx).Id
	var req dto.CartUpdateReq
	if err := c.ShouldBindJSON(&req); err != nil {
		echo.Fail(c).Error(err)
		return
	}

	logic := cart_logic.NewCartLogic(echo.TraceCtx(c))
	err := logic.UpdateCart(userId, &req)
	if err != nil {
		echo.Fail(c).Error(err)
		return
	}
	echo.Success(c, nil)
}

// DeleteCart 删除购物车
func DeleteCart(c *gin.Context) {
	ctx := echo.TraceCtx(c)
	userId := ctxop.GetUser(ctx).Id
	var req dto.CartDeleteReq
	if err := c.ShouldBindJSON(&req); err != nil {
		echo.Fail(c).Error(err)
		return
	}

	logic := cart_logic.NewCartLogic(echo.TraceCtx(c))
	err := logic.DeleteCart(userId, &req)
	if err != nil {
		echo.Fail(c).Error(err)
		return
	}
	echo.Success(c, nil)
}

// BatchUpdateSelected 批量更新选中状态
func BatchUpdateSelected(c *gin.Context) {
	ctx := echo.TraceCtx(c)
	userId := ctxop.GetUser(ctx).Id
	var req dto.CartBatchUpdateSelectedReq
	if err := c.ShouldBindJSON(&req); err != nil {
		echo.Fail(c).Error(err)
		return
	}

	logic := cart_logic.NewCartLogic(echo.TraceCtx(c))
	err := logic.BatchUpdateSelected(userId, &req)
	if err != nil {
		echo.Fail(c).Error(err)
		return
	}
	echo.Success(c, nil)
}

// ClearCart 清空购物车
func ClearCart(c *gin.Context) {
	ctx := echo.TraceCtx(c)
	userId := ctxop.GetUser(ctx).Id
	logic := cart_logic.NewCartLogic(echo.TraceCtx(c))
	err := logic.ClearCart(userId)
	if err != nil {
		echo.Fail(c).Error(err)
		return
	}
	echo.Success(c, nil)
}

// GetCartStock 获取购物车商品库存状态
func GetCartStock(c *gin.Context) {
	ctx := echo.TraceCtx(c)
	userId := ctxop.GetUser(ctx).Id
	logic := cart_logic.NewCartLogic(echo.TraceCtx(c))
	resp, err := logic.GetCartStock(userId)
	if err != nil {
		echo.Fail(c).Error(err)
		return
	}
	echo.Success(c, resp)
}

// CreateOrder 创建订单
func CreateOrder(c *gin.Context) {
	ctx := echo.TraceCtx(c)
	userId := ctxop.GetUser(ctx).Id
	var req dto.CreateOrderReq
	if err := c.ShouldBindJSON(&req); err != nil {
		echo.Fail(c).Error(err)
		return
	}

	logic := cart_logic.NewCartLogic(echo.TraceCtx(c))
	resp, err := logic.CreateOrder(userId, &req)
	if err != nil {
		echo.Fail(c).Error(err)
		return
	}
	echo.Success(c, resp)
}
